import vnode from './vnode'
// 编写一个低配版本的h函数，这个函数必须要求接收3个参数，缺一不可
// 相当于他的重载功能较弱
// 也就是说，调用的时候形态必须是下面的三种之一
// 1形态1.h('div', {}, '文字')
// 2形态2.h('div', {}, [])
// 3形态3.h('div', {}, {})

export default function(sel, data, c) {
    if (arguments.length < 3)
        throw Error('h函数的传入参数不满足3个')
    // 检查参数c类型
    if (typeof c === 'string' || typeof c == 'number') {
        // 说明当前h函数是形态1
        return vnode(sel, data, undefined, c, undefined)

    } else if (Array.isArray(c)) {
        // 说明当前h函数是形态2
        var children = []
        for (let i = 0; i < c.length; i++) {
            // 检查 c[i] 必须是一个对象 或者是一个 字符串，如果不满足
            // 这里不用执行 c[i](), 因为 c[i]如果时 h(...)函数，已经被自动执行了，这里是执行后的返回值
            if (!(typeof c[i] === 'object' && c[i].hasOwnProperty('sel'))) {
                throw Error('传入的第三个参数类型不对 - 数组')
            } else {
                children.push(c[i])
            }
        }
        return vnode(sel, data, children, undefined, undefined)
    } else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
        // 说明是h函数形态3
        return vnode(sel, data, [c], undefined, undefined)
    } else {
        throw Error('传入的第三个参数类型不对')
    }
}